/* 
 * File:   Item.h
 * Author: vicror
 *
 * Created on October 8, 2011, 8:03 PM
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef ITEM_H
#define	ITEM_H
namespace SearchEnginer {

    /**
     * @brief Класс элемента списка.
     *
     * Класс предназначен для хранения данных одного элемента в списке.
     */
    class Item {
    public:

        /**
         * @brief Конструктор пустого элемента
         * @param Нет параметров ввода
         * @return Нет возврашаемого значения
         */
        Item();

        /**
         * @brief Конструктор
         * @param index - индекс элемента
         * @param step - шаг элемента
         * @return Нет возврашаемого значения
         */
        Item(int index, int step);

        /**
         * @brief Конструктор копирования.
         * @param orig - элемент источник
         * @return Нет возврашаемого значения
         */
        Item(const Item& orig);

        /**
         * @brief Деструктор.
         * @param Нет параметров ввода.
         * @return Нет возврашаемого значения.
         */
        ~Item();

        /**
         * @brief Возрашает индекс элемента
         * @param Нет параметров ввода
         * @return Индекс элемента
         */
        int index() const;

        /**
         * @brief Возврашает шаг элемента
         * @param Нет параметров ввода
         * @return Шаг элемента.
         */
        int step() const;

        /**
         * @brief Оператор сравнения "Равно".
         * @param orig - элемент сравнения.
         * @return Если элементы равны, возврашается true иначе false.
         *
         * Оператор сравнения "Равно". Сравнение происходит с учетом index
         * и step элемента.
         */
        bool operator==(const Item& orig) const;

        /**
         * @brief Оператор сравнения "Равно"
         * @param orig - значение, сравнемое с индексом элемента
         * @return Если значение с индексом равны, возврашается true,
         * иначе false.
         *
         * Оператор сравнения "Равно". Сравнение происходит только по индексу.
         */
        bool operator==(const int orig) const;

        /**
         * @brief Оператор сравнения "Не равно".
         * @param orig - элемент сравнения
         * @return Если элементы не равны, то возрашается true,
         * иначе false
         *
         * Оператор сравнения "Равно". Сравнение происходит с учетом index и
         * step элемента.
         */
        bool operator!=(const Item& orig) const;

        /**
         * @brief Оператор сравнения "Не равно"
         * @param orig - значение, сравнимаемое с индексом элемента.
         * @return Если элементы не равны, возврашается true, иначе false.
         *
         * Оператор сравнения "Не равно". Сравнение происходит только по индексу.
         */
        bool operator!=(const int orig) const;

        /**
         * @brief Оператор сравнения "Больше"
         * @param orig - элемент сравнения.
         * @return Если больше, то возрашается true, иначе false.
         *
         * Оператор сравнения "Больше". Сравнение происходит с учетом
         * index и step.
         */
        bool operator>(const Item& orig) const;

        /**
         * @brief Оператор сравнение "Больше".
         * @param orig - значение, сравнимае с индексом элемента.
         * @return Если индекс больше, чем значение, то возврашает true,
         * иначе false.
         *
         * Оператор сравнения "Больше". Сравнение происходит только по индексу.
         */
        bool operator>(const int orig) const;

        /**
         * @brief Оператор сравнения "Меньше"
         * @param orig - элемент сравнения.
         * @return Если меньше, то возврашается true, иначе false.
         *
         * Оператор сравнения "Меньше". Сравнение происходит с учетом
         * index и step.
         */
        bool operator<(const Item& orig) const;

        /**
         * @brief Оператор сравнения "Меньше"
         * @param orig - значение, сравнемае с индексом элемента.
         * @return Если меньше, то возврашается true, иначе false.
         *
         * Оператор сравнения "Меньше".  Сравнение происходит только по индексу.
         */
        bool operator<(const int orig) const;

        /**
         * @brief Оператор сравнения "Больше или равно"
         * @param orig - элемент сравнения.
         * @return Если больше или равно, возврашается true иначе false.
         *
         * Оператор сравнения "Больше или равно". Сравнение происходит с учетом
         * index и step.
         */
        bool operator>=(const Item& orig) const;

        /**
         * @brief Оператор сравнения "Больше или равно"
         * @param orig - значение, сравнемае с индексом элемента.
         * @return Если больше или равно, возврашается true иначе false.
         *
         * Оператор сравнения "Больше или равно".  Сравнение происходит
         * только по индексу.
         */
        bool operator>=(const int orig) const;

        /**
         * @brief Оператор сравнения "Меньше или равно"
         * @param orig - элемент сравнения.
         * @return Если меньше или равно, возврашается true иначе false.
         *
         * Оператор сравнения "Меньше или равно". Сравнение происходит с учетом
         * index и step.
         */
        bool operator<=(const Item& orig) const;

        /**
         * @brief Оператор сравнения "Меньше или равно"
         * @param orig - значение, сравнемае с индексом элемента.
         * @return Если меньше или равно, возврашается true иначе false.
         *
         * Оператор сравнения "Меньше или равно".  Сравнение происходит только
         * по индексу.
         */
        bool operator<=(const int orig) const;

        /**
         * @brief оператор копирования.
         * @param orig - ссылка на источник копирования.
         * @return Возврашается ссылка на экземпляр класса.
         */
        Item& operator=(const Item& orig);
        
        /**
         * @brief Сравнивает два элемента с учетом mix
         * @param orig - элемент сравнения
         * @param mix - смешение
         * @return Если равны, возврашает true, иначе false 
         * 
         * Сравнивает два элемента c учетом, что индексы равны, 
         * а step у второго элемента смешен на значение mix.
         */
        bool isEqualWithMix(const Item& orig, int mix = 0) const;
        
    private:
        int _index;
        int _step;
    };
}
#endif	/* ITEM_H */

